#pragma once

struct CReadMemoryContext
{
	//
	// address on the WP7Accelerometer from where
	// data is to be read
	//
	ULONG m_ulAddress;

	//
	// number of bytes to read from "m_ulAddress"
	//
	ULONG m_ulLength;

	//
	// memory buffer used to accumulate read
	// data in case it comes across through
	// multiple read operations; must be at least
	// as big as "m_ulLength"
	//
	PBYTE m_pReadBuffer;

	//
	// win32 event object used to signal receipt or write
	// acknowledgement
	//
	CAutoResetEvent m_Event;

	//
	// status of the read memory operation
	//
	HRESULT m_hr;

	CReadMemoryContext()
	{
		m_ulAddress = m_ulLength = 0;
		m_pReadBuffer = NULL;
		m_hr = S_OK;
	}
};

struct CWriteMemoryContext
{
	//
	// win32 event object used to signal receipt or write
	// acknowledgement
	//
	CAutoResetEvent m_Event;
};

struct CRequestContext
{
	enum Type
	{
		typeNone = 0,
		typeWriteMemory = 1,		// m_pWriteMemory is valid
		typeReadMemory = 2			// m_pReadMemory is valid
	};

	CRequestContext::Type	m_Type;
	CReadMemoryContext		m_ReadMemory;
	CWriteMemoryContext		m_WriteMemory;

	//
	// Used to track the case where the response from the device
	// is received after the requesting thread times out waiting
	// for a response.
	//
	LONG m_bCancelRequest;

	CRequestContext() :
		m_Type(CRequestContext::typeNone)
	{
	}
};
